#include<iostream>
#include<signal.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<string>
#include<cassert>
#include<cstring>
using namespace std;
void showPending(sigset_t &pending)
{
    for (int sig = 1; sig <= 31; sig++)
    {
        if (sigismember(&pending, sig))
            std::cout << "1";
        else
            std::cout << "0";
    }
    std::cout << std::endl;
}
// void handler(int signum)
// {
//     cout<<"捕捉信号： "<<signum<<endl;
//     sigset_t sig;
//     sigemptyset(&sig);
//     while(true)
//     {
//         sigpending(&sig);
//         showPending(sig);//打印信号集
//         sleep(1);
//     }
// }
// void blockSig(int sig)
// {
//     sigset_t bset;
//     sigemptyset(&bset);//初始化
//     sigaddset(&bset,sig);//添加sig信号到信号集
//     int n = sigprocmask(SIG_BLOCK,&bset,nullptr);//将sig信号屏蔽
//     assert(n==0);
//     (void)n;
// }



// volatile int flag=0;
// void handler(int sig)
// {
//    cout<<"flag:"<<flag;
//     flag = 1;
//     cout<<" -> "<<flag<<endl;
// }
void handler(int signum)
{
    cout<<"子进程退出: "<<signum<<"father: "<<getpid()<<endl;
    waitpid(-1,NULL,WNOHANG);
}

int main()
{
    signal(SIGCHLD,SIG_IGN);//主动设置
    if(fork()==0)
    {
        //子进程
        int count=0;
        while(true)
        {
            count++;
            cout<<"子进程在运行"<<endl;
            sleep(1);
            if(count==10)
                break;
        }
        cout<<"子进程退出"<<endl;
        exit(0);
    }
    while(true)
    {
        cout<<"父进程在运行"<<endl;
         sleep(1);
    }


    // signal(2, handler);
    // while(!flag)
    // {
    // }
    // printf("进程结束\n");
    // return 0;


    // signal(2, SIG_IGN);
    // cout << "getpid: " << getpid() << endl; 
    // // 内核数据类型，用户栈定义的
    // struct sigaction act, oact;
    // act.sa_flags = 0;
    // sigemptyset(&act.sa_mask);
    // act.sa_handler = handler;
    // sigaction(2,&act,&oact);
    // while(true)
    // {
    //     //showPending(oact.sa_mask);//打印信号集
    //     sleep(1);
    // }
    // for(int i=1;i<32;i++)
    // {
    //    blockSig(i);
    // }
    // sigset_t pending;
    // while(true)
    // {
    //     sigpending(&pending);//获取当前进程信号集
    //     showPending(pending);//打印信号集
    //     sleep(1);
    // }

    // for(int i=1;i<32;i++)
    // {
    //     signal(i,handler);
    // }
    // while(true) sleep(1);
    return 0;
}